UNPKG

@lobehub/chat

Version:

Lobe Chat - an open-source, high-performance chatbot framework that supports speech synthesis, multimodal, and extensible Function Call plugin system. Supports one-click free deployment of your private ChatGPT/LLM web application.

97 lines (81 loc) 3.35 kB
import debug from 'debug'; import { NextRequest, NextResponse } from 'next/server'; import { URL } from 'node:url'; import { oidcEnv } from '@/envs/oidc'; import { createNodeRequest, createNodeResponse } from '@/libs/oidc-provider/http-adapter'; import { getOIDCProvider } from '@/server/services/oidc/oidcProvider'; const log = debug('lobe-oidc:route'); // Create a debug instance with a namespace const handler = async (req: NextRequest) => { const requestUrl = new URL(req.url); log(`Received ${req.method.toUpperCase()} request: %s %s`, req.method, req.url); log('Path: %s, Pathname: %s', requestUrl.pathname, requestUrl.pathname); // 声明响应收集器 let responseCollector; try { if (!oidcEnv.ENABLE_OIDC) { log('OIDC is not enabled'); return new NextResponse('OIDC is not enabled', { status: 404 }); } // 获取 OIDC Provider 实例 const provider = await getOIDCProvider(); log(`Calling provider.callback() for ${req.method}`); // Log the method await new Promise<void>((resolve, reject) => { // <-- Make promise callback async let middleware: any; try { log('Attempting to get middleware from provider.callback()'); middleware = provider.callback(); log('Successfully obtained middleware function.'); } catch (syncError) { log('SYNC ERROR during provider.callback() call itself: %O', syncError); reject(syncError); return; } // 使用辅助方法创建响应收集器 responseCollector = createNodeResponse(resolve); const nodeResponse = responseCollector.nodeResponse; // 使用辅助方法创建 Node.js 请求对象,现在需要 await createNodeRequest(req).then((nodeRequest) => { log('Calling the obtained middleware...'); middleware(nodeRequest, nodeResponse, (error?: Error) => { log('Middleware callback function HAS BEEN EXECUTED.'); if (error) { log('Middleware error reported via callback: %O', error); reject(error); } else { log( 'Middleware completed successfully via callback (may be redundant if .end() was called).', ); resolve(); } }); log('Middleware call initiated, waiting for its callback OR nodeResponse.end()...'); }); }); log('Promise surrounding middleware call resolved.'); // 访问最终的响应状态 if (!responseCollector) { throw new Error('ResponseCollector was not initialized.'); } const { responseStatus: finalStatus, responseBody: finalBody, responseHeaders: finalHeaders, } = responseCollector; log('Final Response Status: %d', finalStatus); log('Final Response Headers: %O', finalHeaders); return new NextResponse(finalBody, { // eslint-disable-next-line no-undef headers: finalHeaders as HeadersInit, status: finalStatus, }); } catch (error) { log(`Error handling OIDC ${req.method} request: %O`, error); // Log method in error return new NextResponse(`Internal Server Error: ${(error as Error).message}`, { status: 500 }); } }; export const GET = handler; export const POST = handler; export const PUT = handler; export const DELETE = handler; export const PATCH = handler;